package com.example.sixi.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @Author: Hutengfei
 * @Description:
 * @Date Create in 2019/8/28 20:15
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//    //登录成功处理逻辑
//    @Autowired
//    CustomizeAuthenticationSuccessHandler authenticationSuccessHandler;
//
//    //登录失败处理逻辑
//    @Autowired
//    CustomizeAuthenticationFailureHandler authenticationFailureHandler;
//
//    //权限拒绝处理逻辑
//    @Autowired
//    CustomizeAccessDeniedHandler accessDeniedHandler;
//
//    //匿名用户访问无权限资源时的异常
//    @Autowired
//    CustomizeAuthenticationEntryPoint authenticationEntryPoint;
//
//    //会话失效(账号被挤下线)处理逻辑
//    @Autowired
//    CustomizeSessionInformationExpiredStrategy sessionInformationExpiredStrategy;
//
//    //登出成功处理逻辑
//    @Autowired
//    CustomizeLogoutSuccessHandler logoutSuccessHandler;
//
//    //访问决策管理器
//    @Autowired
//    CustomizeAccessDecisionManager accessDecisionManager;
//
//    //实现权限拦截
//    @Autowired
//    CustomizeFilterInvocationSecurityMetadataSource securityMetadataSource;
//
//    @Autowired
//    private CustomizeAbstractSecurityInterceptor securityInterceptor;

//    @Override
//    @Bean
//    public UserDetailsService userDetailsService() {
//        //获取用户账号密码及权限信息
//        return new UserDetailsServiceImpl();
//    }

//    @Bean
//    public BCryptPasswordEncoder passwordEncoder() {
//        // 设置默认的加密方式（强hash方式加密）
//        return new BCryptPasswordEncoder();
//    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
//        auth.userDetailsService(userDetailsService());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        super.configure(http);
        http.formLogin()
                .loginPage("/index.html")
                .loginProcessingUrl("/login").defaultSuccessUrl("/main")
                .and()
                .authorizeRequests()
                .antMatchers("/index.html", "/login", "/webjars/**/**.js").permitAll()
                .anyRequest().authenticated()
                .and()
                .csrf().disable();


//        http.cors().and().csrf().disable();
//        http.authorizeRequests()
//                .antMatchers("/index", "/index.html").permitAll()
//                .anyRequest().authenticated()
//                .and()
//                .formLogin()
//                //指定登录页的路径
//                .loginPage("/index")
//                //指定自定义form表单请求的路径
//                .loginProcessingUrl("/authentication/form")
//                .failureUrl("/login?error")
//                .defaultSuccessUrl("/success")
//                //必须允许所有用户访问我们的登录页（例如未验证的用户，否则验证流程就会进入死循环）
//                //这个formLogin().permitAll()方法允许所有用户基于表单登录访问/login这个page。
//                .permitAll();
//        http.authorizeRequests().
////                antMatchers("/getUser").hasAuthority("query_user").
////                antMatchers("/**").fullyAuthenticated().
//                withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
//                    @Override
//                    public <O extends FilterSecurityInterceptor> O postProcess(O o) {
//                        o.setAccessDecisionManager(accessDecisionManager);//决策管理器
//                        o.setSecurityMetadataSource(securityMetadataSource);//安全元数据源
//                        return o;
//                    }
//                }).
//                //登出
//                        and().logout().
//                permitAll().//允许所有用户
//                logoutSuccessHandler(logoutSuccessHandler).//登出成功处理逻辑
//                deleteCookies("JSESSIONID").//登出之后删除cookie
//                //登入
//                        and().formLogin().
//                permitAll().//允许所有用户
//                successHandler(authenticationSuccessHandler).//登录成功处理逻辑
//                failureHandler(authenticationFailureHandler).//登录失败处理逻辑
//                //异常处理(权限拒绝、登录失效等)
//                        and().exceptionHandling().
//                accessDeniedHandler(accessDeniedHandler).//权限拒绝处理逻辑
//                authenticationEntryPoint(authenticationEntryPoint).//匿名用户访问无权限资源时的异常处理
//                //会话管理
//                        and().sessionManagement().
//                maximumSessions(1).//同一账号同时登录最大用户数
//                expiredSessionStrategy(sessionInformationExpiredStrategy);//会话失效(账号被挤下线)处理逻辑
//        http.addFilterBefore(securityInterceptor, FilterSecurityInterceptor.class);
    }
}
